package com.iuhao.orange.exception;

import com.fasterxml.jackson.core.JsonParseException;
import com.iuhao.orange.response.O2OJSON;
import com.iuhao.orange.response.ResponseCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.TypeMismatchException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.security.auth.login.LoginException;

/**
 * @author yanhao
 * @date 2018/7/19 9:13
 * 全局异常处理
 * @return
 */
@ControllerAdvice
public class GlobalExceptionHandler {


    public static final Logger logger = LoggerFactory.getLogger(BaseException.class);

    /**
     * 功能描述:
     * 全局异常处理
     *
     * @auther: yanhao
     * @param:
     * @date: 2018/8/12 10:04
     * @Description:
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public O2OJSON handlerEnergyException(Exception e) {
        O2OJSON json = new O2OJSON();
        if (e instanceof BaseException) {
            logger.error("【BaseException】 e={}", e);
            json.setError(ResponseCode.DEFAULT_ERROR, e.getMessage());
        } else if (e instanceof LoginException) {
            logger.error("【LoginException】 e={}", e);
            json.setError(ResponseCode.UNAUTHORIZED, e.getMessage());
        } else if (e instanceof O2OServerException) {
            // 此异常为 controller 方法中 接受参数时抛出的异常
            logger.error("【O2OServerException】 e={}", e);
            json.setError(ResponseCode.DEFAULT_ERROR, e.getMessage());
        } else if (e instanceof HttpMessageNotReadableException) {
            // 此异常为 controller 方法中 接受参数时抛出的异常
            logger.error("【参数格式错误】 e={}", e);
        } else if (e instanceof TypeMismatchException) {
            // 此异常为 controller 方法中 接受参数时抛出的异常
            logger.error("【参数格式错误】 e={}", e);
        } else if (e instanceof MethodArgumentNotValidException) {
            // 此异常为 controller 方法中 参数校验时出现异常
            logger.error("【参数格式错误】 e={}", e);
            json.setError(ResponseCode.DEFAULT_ERROR, e.getMessage());
        } else if (e instanceof JsonParseException) {
            // 此异常为 controller 方法中 解析传入的json时报错
            logger.error("【参数格式错误】 e={}", e);
        } else {
            // 一般由系统抛出的异常 如果sql错误
            logger.error("【未知错误】 e={}", e);
            logger.error("未知异常" + e.getMessage());
            json.setError(ResponseCode.DEFAULT_ERROR, "服务器异常,请联系二师兄!");
        }
        return json;
    }

}
